package com.ahpu.lyf.queue;

import java.util.Scanner;

public class CircleArrayQueueDemo {
    public static void main(String[] args) {
        CircleArray circleArray=new CircleArray(5);
        char key=' ';
        Scanner scanner=new Scanner(System.in);
        boolean loop=true;
        while (loop){
            System.out.println("s(show),显示队列");
            System.out.println("e(exit),退出测试");
            System.out.println("a(add)，数据入队");
            System.out.println("g(get),数据出队");
            key=scanner.next().charAt(0);
            switch (key){
                case 's':circleArray.showQueue();break;
                case 'e':loop=false;
                case 'a':
                    System.out.println("输入要入队的数据");
                    int data = scanner.nextInt();
                    circleArray.addQueue(data);
                    break;
                case 'g':circleArray.getQueue();
                default:break;
            }
        }
        System.out.println("Bye~~~");
    }
}

class CircleArray {
    private Integer front=0;
    private Integer rear=0;
    private final Integer maxSize;
    private final int[] arr;

    /**
     * 队构造器
     * @param arrMaxSize 设置队列最大能存的个数
     */
    public CircleArray(int arrMaxSize){
        this.maxSize=arrMaxSize;
        this.arr=new int[arrMaxSize];
    }

    /**
     * 判断队列是否满
     * @return 环形队列为空的条件是(rear+1)%maxSize==front
     */
    public boolean isFull(){
        return (rear+1)%maxSize==front;
    }

    /**
     * 判断队列是否为空
     * @return 环形队列为空的条件rear==front
     */
    public boolean isEmpty(){
        return rear.equals(front);
    }

    /**
     * 入队一个数据
     * @param data 要入队的数据
     */
    public void addQueue(int data) {
        if(isFull()){
            System.out.println("队列满，不能添加数据！");
            return;
        }
        // 将数据插入
        arr[rear]=data;
        //rear后移一位，要考虑取模，当rear在倒数第二个位置时,下一个rear因该指向0号位
        rear=(rear+1)%maxSize;

    }

    /**
     * 求出当前队列有效数据的个数
     * @return 当前队列有效元素的个数
     */
    public int size(){
        return (rear+maxSize-front)%maxSize;
    }

    /**
     * 打印队列所有元素
     */
    public void showQueue() {
        if (isEmpty()){
            System.out.println("队列空！");
            return;
        }
        //从front开始遍历，遍历有效元素次
        for (int i = front; i < front+size(); i++) {
            System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
        }
    }

    /**
     * 从队列取出一个数据
     */
    public void getQueue() {
        if (isEmpty()){
            System.out.println("队列空！");
            return ;
        }
        int res = arr[front];
        front=(front+1)%maxSize;
        System.out.println(res);
    }

}